package luo.hui.jiang.stack;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * @author 罗惠江
 * @version 1.0
 * @email 1511619294@qq.com
 * @date 2020/7/28 16:19
 */
public class PolandNotation {
    public static void main(String[] args) {
        //先定义给逆波兰表达式
        String suffixExpression = "4 5 * 8 - 60 + 8 2 / +";// 的出的结果为 76
        List<String> list = getListString(suffixExpression);
        System.out.println(list);
        int res = calculate(list);
        System.out.println(res);
    }


    // 将一个逆波兰表达式的，依次将数据和运算符放入到ArrayList 中
    public static List<String> getListString(String suffixExpression) {

        // 将 suffixExpression 分割
        String[] split = suffixExpression.split(" ");
        List<String> list = new ArrayList<String>();
        for (String ele : split) {
            list.add(ele);
        }
        return list;
    }


    // 完成对逆波兰表达式的运算   其实可以不用栈都可以完成和这个东西
    // 他的格式是， X1,X2,运算符，  结果在存入到 栈中，这样下面的数据进来又成了X1，X2的格式
    public static int calculate(List<String> ls) {
        // 创建一个栈，只需要一个栈即可
        Stack<String> stack = new Stack<String>();
        // 遍历 ls
        for (String item : ls) {
            // 这里使用正则表达是来取出数
            if (item.matches("\\d+")) { // 匹配的是多为数
                // 入栈
                stack.push(item);
            } else {
                // pop 出两个数，并运算，在入栈
                int num2 = Integer.parseInt(stack.pop());
                int num1 = Integer.parseInt(stack.pop());
                int res = 0;
                if (item.equals("+")) {
                    res = num1 + num2;
                } else if (item.equals("-")) {
                    res = num1 - num2;
                } else if (item.equals("*")) {
                    res = num1 * num2;
                } else if (item.equals("/")) {
                    res = num1 / num2;
                } else {
                    throw new RuntimeException("运算符有误");
                }
                // 吧res 入栈
                stack.push("" + res);
            }
        }
        return Integer.parseInt(stack.pop());
    }
}


